#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "uf.h"
#include "colap.h"
#include "cr.h"
#include "cw.h"
#include "stack.h"
#include "error.h"

int main (void)
{
	colap cp=NULL;
	union_find cf=NULL;
	cintrar cra=NULL;
	cintwar cwa=NULL;
	stack s1=NULL,s2=NULL;
	arista e=NULL;
	tufset f1,f2;
	char* name=NULL;

	cra = cra_create();
	cra_arr(cra);
	name = cra_name(cra);
	cwa = cwa_create(name);
	cwa_arr(cwa);
	free(name);
	name = NULL;
	cp = colap_create(cra_cantaris(cra));
	s1 = st_empty(cra_cantaris(cra));
	s2 = st_empty(cra_cantaris(cra));
	cf = uf_create(cra_cantvert(cra));

	while(!cra_fin(cra))
	{
		e = cra_elec(cra);
		colap_encolar(cp,e);
		uf_add_singulete(cf,arista_v1(e));
		uf_add_singulete(cf,arista_v2(e));
        	e = arista_destroy(e);
		cra_av(cra);
	}
    
    /*Dios m�o, si llegamos a este punto con un union-find vac�o estamos en el horno. Nadie avis� que se necesitaba un m�todo para contabilizar los conjuntos!*/
    while(!uf_oneset(cf) && !colap_vacia(cp))
    {
        e = colap_primero(cp);
        colap_pop(cp);
        f1 = uf_find(cf,arista_v1(e));
        f2 = uf_find(cf,arista_v2(e));
        if(f1 != f2)
        {
            uf_union(cf,f1,f2);
            s1 = push(s1,e);
        }
        else
        {
            s2 = push(s2,e);
        }
	e = arista_destroy(e);
    }
    
    while(!is_empty(s1))
    {
        e = top(s1);
	cwa_insarbol(cwa,e);
        s1 = pop(s1);
       
    }
      
    while(!is_empty(s2))
    {
        e = top(s2);
	cwa_insrest(cwa, e);
        s2 = pop(s2);
    }

    while(!colap_vacia(cp))
    {
        e = colap_saca(cp);
        cwa_insrest(cwa, e);
        e = arista_destroy(e);
    }

    printf("#La cantidad de componentes conexas del grafo es: %i\n",uf_ccc(cf));

    cp = colap_destroy(cp);
    cf = uf_destroy(cf);
    cwa = cwa_destroy(cwa);
    cra = cra_destroy(cra);
    s1 = destroy(s1);
    s2 = destroy(s2);

    return 0;	
}
